#!/bin/bash




输入重定向：<
    wc -l < 123.txt ，统计123.txt文件中有多少行
输出重定向：>代表覆盖写入 ； >> 代表追加写入
    cat >> 123.txt ，表示向123.txt中追加内容，ctrl + c进行保存
    cat >123.txt ，表示向123.txt中填加内容，覆盖之前的内容，ctrl + c进行保存
    ls -lrt >123.txt，表示将ls显示的内容添加到123.txt文件中，其他显示类的命令都可以
    echo '123455' > 123.txt，将字符串123455添加到123.txt文件中，并覆盖之前的内容





注意，>与>>的写法可写成 1> , 1>>




https://www.cnblogs.com/jamesf/p/4751517.html
将Linux 标准输出，错误输出重定向到文件

1.想要把make输出的全部信息，输出到某个文件中，最常见的办法就是：
    make xxx > build_output.txt
    此时默认情况是没有改变2=stderr的输出方式，还是屏幕，所以，如果有错误信息，还是可以在屏幕上看到的。

2.只需要把make输出中的错误（及警告）信息输出到文件中ing，可以用：
    make xxx 2> build_output.txt
    相应地，由于1=stdout没有变，还是屏幕，所以，那些命令执行时候输出的正常信息，还是会输出到屏幕上，你还是可以在屏幕上看到的。

3.只需要把make输出中的正常（非错误，非警告）的信息输出到文件中，可以用：
    make xxx 1> build_output.txt
    相应地，由于2=stderr没有变，还是屏幕，所以，那些命令执行时候输出的错误信息，还是会输出到屏幕上，你还是可以在屏幕上看到的。

4.想要把正常输出信息和错误信息输出到分别的文件中，可以用：
    make xxx 1> build_output_normal.txt 2>build_output_error.txt
    即联合使用了1和2，正常信息和错误信息，都输出到对应文件中了。

5. 所有的信息都输出到同一个文件中：
    make xxx > build_output_all.txt 2>&1
    其中的2>&1表示错误信息输出到&1中，而&1，指的是前面的那个文件：build_output_all.txt 。

注意：上面所有的1,2等数字，后面紧跟着大于号'>' ，中间不能有空格。







> 以擦写的模式重定向至...
>> 以追加的模式重定向至...
0 代表stdin=standard input标准输入
1 代表stdout=standard output标准输出
2 代表stderr=standard error标准错误

>默认为标准输出重定向，与 1>相同
2>&1意思是把 标准错误输出 重定向到 标准输出.
&>file意思是把 标准输出 和 标准错误输出 都重定向到文件file中
2>&1 > file 把错误出定向到标准输出（此时标准输出为终端,所以输出到终端）， 标准输出定位到文件
> file 2>&1 把标准输出定位到文件，错误输出到标准输出（此时标准输出指向文件，所以输出到文件）


ls -lrt /boot /test &> 123.txt，表示不管正确与否都输出到123.txt文件


git push > log.txt
    理论上我们平常git push后的反馈就会保存到log.txt这个文件里了，且屏幕上不会显示任何东西。
    但其实这个还是有问题的，因为事后我们发现有一些存到了log.txt，还有一些话漏网显示到了屏幕上，没存进去文档里。
    其实原来这些显示到屏幕上的反馈有些是stdout有些是stderr，我们用>或>>符号重定向，只是默认重定向stdout，没有重定向stderr，所以会有漏网之鱼。对此，我们需要了解下这个符号的设定，和怎么把stderr也包括进来，一起重定向过去

2>&1
    每次查重定向问题时，我们总会看到这句话，一般人很难理解这到底是在干嘛。我一开始以为是2要大于1什么的，真是笑话。
    其实这是个重定向的设置，设置让2重定向到1，也就是让stderr标准错误重定向到stdout标准输出，然后两个并在一起再重定向。其中&没什么意思只是区分开来1是代表stdout而不是代表一个文件名。
    用起来的格式是：cmd > file 2>&1。
    为什么设置要放在后面呢?
    具体暂时还不知道，只知道是这么用，放在前面还不行只能放在后面。

git push > log.txt 2>&1
    那么这时候，屏幕上就真的不会显示任何东西了，标准输出、标准错误，全部都会存到log.txt文件里了。

重定向符号>与&号：
    1>&2 正确返回值传递给2输出通道 &2表示2输出通道，如果此处错写成 1>2, 就表示把1输出重定向到文件2中.。
    2>&1 错误返回值传递给1输出通道, 同样&1表示1输出通道. 而不是一个文件。

>是重定向符，就是把前面输出的内容重定向到后面指定的位置
    echo "一些内容" > filename.txt
>前是可以加数字来说明把什么内容重定向到文件中，默认是把标准输出重定向到文件中，所以下面这个例子和上面那个是一样的：
    echo "一些内容" 1> filename.txt


& 是一个描述符，如果1或2前不加&，会被当成一个普通文件。

1>&2 意思是把标准输出重定向到标准错误.

2>&1 意思是把标准错误输出重定向到标准输出。

&>filename 意思是把标准输出和标准错误输出都重定向到文件filename中


所以，cmd > file实际上是缩略了的写法，理解起来，应该是cmd &1> file，也就是只把标准输出转出去（重定向到文件）。
那么同理，只把标准错误转出去，就应该是cmd &2> file


其中，&符号没任何实际意义，只是以至区分，代表后面的符号是要设置重定向用的，而不是某个文件的名字。文章末尾单独补充下&符号的作用


把标准输出和标准错误都放入一个文件中
ls
a.php  README.md

ls -la a.php
    -rw-r-----@ 1 a123456  staff  8681 11 22 15:38 a.php
ls -la a.php b.php
    ls: b.php: No such file or directory
    -rw-r-----@ 1 a123456  staff  8681 11 22 15:38 a.php

不正确的写法
ls -la a.php b.php 1> out.log 2> out.log
cat out.log
    -rw-r-----@ 1 a123456  staff  8681 11 22 15:38 a.php

正确的写法
ls -la a.php b.php > out.log 2>&1
cat out.log
    ls: b.php: No such file or directory
    -rw-r-----@ 1 a123456  staff  8681 11 22 15:38 a.php



经常可以在一些脚本，尤其是在crontab调用时发现如下形式的命令调用/tmp/test.sh > /tmp/test.log 2>&1
前半部分/tmp/test.sh > /tmp/test.log很容易理解，那么后面的2>&1是怎么回事呢？

要解释这个问题，还是得提到文件重定向。我们知道>和<是文件重定向符。那么1和2是什么？
在shell中，每个进程都和三个系统文件相关联：标准输入stdin，标准输出stdout和标准错误stderr，三个系统文件的文件描述符分别为0，1和2。
所以这里2>&1 的意思就是将标准错误也输出到标准输出当中。

nohup /mnt/Nand3/H2000G > /dev/null 2>&1 &
    对于& 1 更准确的说应该是文件描述符 1,而1 一般代表的就是STDOUT_FILENO,实际上这个操作就是一个dup2(2)调用.他标准输出到all_result ,
    然后复制标准输出到文件描述符2(STDERR_FILENO),其后果就是文件描述符1和2指向同一个文件表项,也可以说错误的输出被合并了.
    其中0 表示键盘输入 1表示屏幕输出 2表示错误输出.把标准出错重定向到标准输出,然后扔到/DEV/NULL下面去。
    通俗的说，就是把所有标准输出和标准出错都扔到垃圾桶里面
    nohup 顾名思义，nohup 的用途就是让提交的命令忽略 hangup 信号
    注意：使用了nohup之后，很多人就这样不管了，其实这样有可能在当前账户非正常退出或者结束的时候，命令还是自己结束了。所以在使用nohup命令后台运行命令之后，需要使用exit正常退出当前账户，这样才能保证命令一直在后台运行。


command > out.file 2>&1 &
    command > out.file是将command的输出重定向到out.file文件，
    即输出内容不打印到屏幕上，而是输出到out.file文件中。
    2>&1 是将标准出错重定向到标准输出，这里的标准输出已经重定向到了out.file文件，
    即将标准出错也输出到out.file文件中。最后一个& ， 是让该命令在后台执行

试想2>1代表什么，2与>结合代表错误重定向，而1则代表错误重定向到一个文件1，而不代表标准输出；
换成2>&1，&与1结合就代表标准输出了，就变成错误重定向到标准输出

你可以用
    ls 2>1测试一下，不会报没有2文件的错误，但会输出一个空的文件1；
    ls xxx 2>1测试，没有xxx这个文件的错误输出到了1中；
    ls xxx 2>&1测试，不会生成1这个文件了，不过错误跑到标准输出了；
    ls xxx >out.txt 2>&1, 实际上可换成 ls xxx 1>out.txt 2>&1；重定向符号>默认是1,错误和输出都传到out.txt了。

为何2>&1要写在后面？
    command > file 2>&1
        首先是command > file将标准输出重定向到file中， 2>&1 是标准错误拷贝了标准输出的行为，也就是同样被重定向到file中，最终结果就是标准输出和错误都被重定向到file中
    command 2>&1 >file
        2>&1 标准错误拷贝了标准输出的行为，但此时标准输出还是在终端。>file 后输出才被重定向到file，但标准错误仍然保持在终端
    用strace可以看到：
        1. command > file 2>&1
            这个命令中实现重定向的关键系统调用序列是：
            open(file) == 3
            dup2(3,1)
            dup2(1,2)

        2. command 2>&1 >file
            这个命令中实现重定向的关键系统调用序列是：
            dup2(1,2)
            open(file) == 3
            dup2(3,1)


把/dev/null看作"黑洞". 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而, /dev/null对命令行和脚本都非常的有用.表示无底洞你可以把它当作垃圾 回收站来理解。
    禁止标准输出
    cat $filename >/dev/null
        文件内容丢失，而不会输出到标准输出.

    禁止标准错误
    rm $badname 2>/dev/null
        这样错误信息[标准错误]就被丢到太平洋去了.

    清除日志文件内容
    cat /dev/null > /var/log/messages
    : > /var/log/messages   有同样的效果, 但不会产生新的进程.（因为:是内建的）
    cat /dev/null > /var/log/wtmp



linux中快速清空文件内容的几种方法
    1. 通过重定向到 Null 来清空文件内容
        清空或者让一个文件成为空白的最简单方式，是像下面那样，通过 shell 重定向 null （不存在的事物）到该文件：
        $ > filename


    2. 使用 ‘true' 命令重定向来清空文件
        下面我们将使用 : 符号，它是 shell 的一个内置命令，等同于 true 命令，它可被用来作为一个 no-op（即不进行任何操作）。另一种清空文件的方法是将 : 或者 true 内置命令的输出重定向到文件中，具体如下：
        $ : > filename

    3. 使用 cat/cp/dd 实用工具及 /dev/null 设备来清空文件
        在 Linux 中， null 设备基本上被用来丢弃某个进程不再需要的输出流，或者作为某个输入流的空白文件，这些通常可以利用重定向机制来达到，所以 /dev/null 设备文件是一个特殊的文件，它将清空送到它这里来的所有输入，而它的输出则可被视为一个空文件。另外，你可以通过使用 cat命令 显示 /dev/null 的内容然后重定向输出到某个文件，以此来达到清空该文件的目的。
        $ cat /dev/null > filename

    4. 使用 echo 命令清空文件
        在这里，你可以使用 echo命令 将空字符串的内容重定向到文件中，具体如下：
        $ echo "" > filename
        $ echo > filename


    5. 使用 truncate 命令来清空文件内容
        truncate 可被用来将一个文件缩小或者扩展到某个给定的大小。
        你可以利用它和 -s 参数来特别指定文件的大小。要清空文件的内容，则在下面的命令中将文件的大小设定为 0:
        truncate -s 0 access.log



重定向标准输入
cat >> alvin.log <<EOF
> my name is alvin
> my name is gongda
> good bye,..
> EOF
[root@test-1 ~]# ftp -i -n 127.0.0.1<<EOF
> user ftp ftp
> dir
> EOF
drwxr-xr-x    2 0        0            4096 Oct 17 23:54 pub


简单的c 程序
https://blog.csdn.net/weixin_46959681/article/details/112383604



jobs
    查看当前有多少在后台运行的命令。
    jobs -l选项可显示所有任务的PID，jobs的状态可以是running, stopped, Terminated。但是如果任务被终止了（kill），shell 从当前的shell环境已知的列表中删除任务的进程标识。
https://blog.csdn.net/liuyanfeier/article/details/62422742


nohup 示例
    [root@pvcent107 ~]# nohup ping www.ibm.com &
    [1] 3059
    nohup: appending output to `nohup.out'
    [root@pvcent107 ~]# ps -ef |grep 3059
    root      3059   984  0 21:06 pts/3    00:00:00 ping www.ibm.com
    root      3067   984  0 21:06 pts/3    00:00:00 grep 3059

setsid 示例
    nohup 无疑能通过忽略 HUP 信号来使我们的进程避免中途被中断，但如果我们换个角度思考，如果我们的进程不属于接受 HUP 信号的终端的子进程，那么自然也就不会受到 HUP 信号的影响了。setsid 就能帮助我们做到这一点
    可见 setsid 的使用也是非常方便的，也只需在要处理的命令前加上 setsid 即可。
    [root@pvcent107 ~]# setsid ping www.ibm.com
    [root@pvcent107 ~]# ps -ef |grep www.ibm.com
    root     31094     1  0 07:28 ?        00:00:00 ping www.ibm.com
    root     31102 29217  0 07:29 pts/4    00:00:00 grep www.ibm.com
    值得注意的是，上例中我们的进程 ID(PID)为31094，而它的父 ID（PPID）为1（即为 init 进程 ID），并不是当前终端的进程 ID。请将此例与nohup 例中的父 ID 做比较。
    setsid sh ./sh/queue_redis_group_consumer_msg_server.sh  wx792152cf7d4b3d45 visit_log_zwnceshi_setsid   >>  visit_log_wx_zwnceshi_setsid_792152cf7d4b3d45.txt 2>&1  &
        [2] 16345
        [2]+  完成                  setsid sh ./sh/queue_redis_group_consumer_msg_server.sh wx792152cf7d4b3d45 visit_log_zwnceshi_setsid >> visit_log_wx_zwnceshi_setsid_792152cf7d4b3d45.txt 2>&1
    ps -ef | grep 'visit_log_zwnceshi_setsid'
        root     16346     1  0 13:00 ?        00:00:00 sh ./sh/queue_redis_group_consumer_msg_server.sh wx792152cf7d4b3d45 visit_log_zwnceshi_setsid
        root     16347 16346  0 13:00 ?        00:00:00 php artisan command:queue_redis_group_consumer_msg_server --env=wx792152cf7d4b3d45 --group_name=visit_log_zwnceshi_setsid
        root     16422 13618  0 13:00 pts/2    00:00:00 grep --color=auto visit_log_zwnceshi_setsid





# Linux 判断上一个语句是否执行成功
# https://developer.aliyun.com/article/661051
#
简介： shell脚本中判断上一个命令是否执行成功 shell中使用符号“$?”来显示上一条命令执行的返回值，如果为0则代表执行成功，其他表示失败。 结合if-else语句实现判断上一个命令是否执行成功。
shell脚本中判断上一个命令是否执行成功

shell中使用符号“$?”来显示上一条命令执行的返回值，如果为0则代表执行成功，其他表示失败。

结合if-else语句实现判断上一个命令是否执行成功。

示例如下：

if [ $? -ne 0 ]; then

    echo "failed"

else

    echo "succeed"

fi

或者：

if [ $? -eq 0 ]; then

    echo "succeed"

else

    echo "failed"

fi

shell中的比较符号如下：
-eq 等于
-ne	不等于
-gt 大于
-lt	小于
ge	大于等于
le	小于等于












